package top.wangjiu.java.jvm.attribute;

import top.wangjiu.java.jvm.AttributeInfo;
import top.wangjiu.java.jvm.constantinfo.ConstantPoolInfo;

/**
 * Signature 属性是可选的定长属性，位于 ClassFile， field_info 或 method_info结构的属性表中。
 * 在 Java 语言中，任何类、 接口、 初始化方法或成员的泛型签名如果包含了类型变量（ Type Variables） 或参数化类型（ Parameterized Types），
 * 则 Signature 属性会为它记录泛型签名信息。
 *
 */
public class SignatureAttr extends AttributeInfo {

    public final static String NAME = "Signature";

    private final short attributeNameIndex;   //属性名索引
    private final int attributeLength;
    //字段值在常量池中的索引，常量池在该索引处的项给出该属性表示的常量值。（例如，值是long型的，在常量池中便是CONSTANT_Long）
    private final short signatureIndex;

    public SignatureAttr(short attributeNameIndex, byte[] bytes){
        this.attributeNameIndex = attributeNameIndex;
        this.attributeLength = bytes.length;
        this.signatureIndex = (short) (bytes[0]<<8 | bytes[1]);
    }

    @Override
    public short attributeNameIndex() {
        return attributeNameIndex;
    }

    @Override
    public int attributeLength() {
        return attributeLength;
    }

    @Override
    public String toString(ConstantPoolInfo[] poolInfos) {
        return "Signature:"+poolInfos[signatureIndex].toString(poolInfos);
    }
}
